首页 > 试题广场 >

把字符串转换成整数(atoi)

[编程题]把字符串转换成整数(atoi)
  • 热度指数:59339 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符('+' 或 '-')
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3  整数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格


数据范围:
1.0 <=字符串长度<= 100
2.字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成


示例1

输入

"82"

输出

82
示例2

输入

"   -12  "

输出

-12

说明

去掉前后的空格,为-12  
示例3

输入

"4396 clearlove"

输出

4396

说明

6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分  
示例4

输入

"clearlove 4396"

输出

0
示例5

输入

"-987654321111"

输出

-2147483648
function StrToInt(s) {
  // write code here
  let ns = s.trim() + "";
  let sym = ns[0] == "-" ? "-" : ns[0] == "+" ? "+" : "";
  let fix = sym ? ns.slice(1) : ns;

  if (!(fix[0] * 1) && fix[0] != 0) {
    return 0;
  }

  let num = "";
  let n = 0;
  for (let i = 0; i < fix.length; i++) {
    let check = fix.slice(0, i + 1);
    if (check == "0".repeat(i + 1)) {
      n++;
      if (fix.slice(n, i + 1)) {
        num += fix[i];
      }
    } else if (!(check * 1) || check.includes(".")) {
      break;
    } else {
      num += fix[i];
    }
  }
  if (sym == "+") {
    num = num * 1 > 2 ** 31 ? 2 ** 31 : num;
  } else {
    num = num * 1 > 2 ** 31 - 1 ? 2 ** 31 - 1 : num;
  }

let res= num?(sym + num) * 1:0
  return res;
}


发表于 2023-09-23 10:29:18 回复(0)
parseInt是真好用啊
function StrToInts ) {
    // write code here
    if(parseInt(s) > 2147483647)
        return 2147483647
    else if(parseInt(s) < -2147483648)
        return -2147483648
    else
        return parseInt(s)?parseInt(s):0
}
module.exports = {
    StrToInt : StrToInt
};
发表于 2022-11-04 14:54:55 回复(1)
export function StrToInt(s: string): number {
    // write code here
    let str = s.trim();
    if(!str){
        return 0;
    }
    if(str[0] != "+" && str[0] != "-" && !(str[0] >= "0" && str[0] <= "9")){
        return 0;
    }
    
    let index = 0;
    if(str[0] == "+" || str[0] == "-"){
        index++;
    }
    for(;index < str.length; index++){
        let c = str[index];
        if(c < "0" || c > "9"){
            break;
        }
    }
    if(str[0] == "+" || str[0] == "-"){
        if(Number(str.slice(1,index))){
                if(Number(str.slice(1,index)) > 2**31 - 1 && str[0] == "+"){
                return 2**31 - 1;
                }else if(Number(str.slice(0,index)) < -(2**31) && str[0] == "-"){
                    return -(2**31);
                }else{
                    return Number(str.slice(0,index));
                }
        }else{
            return 0;
        }
    }else{
        if(Number(str.slice(0,index))){
            if(Number(str.slice(0,index)) > 2**31 - 1){
                return 2**31 - 1;
                }else if(Number(str.slice(0,index)) < -(2**31)){
                    return -(2**31);
                }else{
                    return Number(str.slice(0,index));
                }
        }else{
            return 0;
        }
    }
}
发表于 2022-05-06 14:23:01 回复(0)

问题信息

上传者:牛客301499号
难度:
3条回答 3262浏览

热门推荐

通过挑战的用户